#include "EpollServer.hpp"
#include <memory>
#include "Protocol.hpp"
using namespace std;

//业务处理调用
Response ResCalculate(const Request &req)
{
    Response res(0, 0);
    switch (req._op)
    {
    case '+':
        res._result = req._x + req._y;
        break;
    case '-':
        res._result = req._x - req._y;
        break;
    case '*':
        res._result = req._x * req._y;
        break;
    case '/':
        if (req._y == 0)
        {
            res._code = 1;
        }
        else
        {
            res._result = req._x / req._y;
        }
        break;
    case '%':
        if (req._y == 0)
        {
            res._code = 2;
        }
        else
        {
            res._result = req._x % req._y;
        }
        break;
    default:
        res._code = 3;
        break;
    }
    return res;
}

//业务处理
void Calculate(Connection *con, Request &req)
{
    Response res = ResCalculate(req);
    string responsestr;
    //序列化
    res.Serialize(responsestr);
    //添加报头
    responsestr = AddHeader(responsestr);
    //
    con->_outbuffer = responsestr;
    // epoll中，关于fd的读取，一般要常设置(一直要让epoll关心的)
    //  关于fd的写入，一般是按需设置(不能常设置)，只有需要发送的时候，才设置！！
    //主要是因为我们的写事件基本上是一直就绪的，写完了不需要等待epoll_wait返回就又就绪了，一直就绪的
    // 开启对write 事件的关心
    con->_ptr->EnableReaderWriter(con->_fd, true, true); 
    // 初次设置对写事件的关心，对应的fd会立马触发一次就绪(因为是初次设置，发送buffer一定是空的,指的是底层的输出缓冲区)
}

int main()
{
    unique_ptr<EpollServer> ptr(new EpollServer(Calculate));
    ptr->Init();
    ptr->Dispatcher();

    return 0;
}